package com.qf.controller;

import com.qf.entity.Order;
import com.qf.feign.api.OrderService;
import com.qf.wxpay.sdk.QfWxConfig;
import com.qf.wxpay.sdk.WXPay;
import com.qf.wxpay.sdk.WXPayUtil;
import com.qf.wxpay.zxing.QRCodeUtils;
import io.goeasy.GoEasy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@Controller
@RequestMapping("/weiXinPayController")
public class WeiXinPayController {

    @Autowired
    private OrderService orderService;

    @Autowired
    private GoEasy goEasy;

    // 这个接口由微信来调用(用户支付成功后)
    @RequestMapping("/resultUrl")
    @ResponseBody
    public void resultUrl(@RequestBody String xml, HttpServletResponse response) throws Exception {
        System.out.println("用户调用了我们的回调的接口，我们可以在这里把订单的状态修改为已支付");
        System.out.println(xml);

        Map<String, String> notifyMap = WXPayUtil.xmlToMap(xml);

        // 订单编号
        String out_trade_no = notifyMap.get("out_trade_no");

        // 1.判断这个订单是否已经处理过了(是否已经支付了)
        Order order = orderService.getOrderById(out_trade_no);
        String result_code = notifyMap.get("result_code"); // 支付的状态

        // 2.如果已经处理过了，直接告诉微信这个订单我已经处理了，你不要在推给我
        if (1 == order.getStatus()) {
            // 判断用户已经支付成功了
            if ("SUCCESS".equals(result_code)) {

                // 说明订单是未支付的状态，要把它修改成已支付
                orderService.updateOrderStatus(out_trade_no, 2);

                // 通知页面跳转到支付成功页面
                // 2.发送消息
                goEasy.publish(out_trade_no, "ok");
            }
        }

        // 3.如果没有处理过，修改订单的状态，然后通知微信，这个订单我处理完了

        // 4.做出应答,        // 通知微信这个订单我已经确认完了
        response.getWriter().write("<xml>\n" +
                "  <return_code><![CDATA[SUCCESS]]></return_code>\n" +
                "  <return_msg><![CDATA[OK]]></return_msg>\n" +
                "</xml>");
    }

    @RequestMapping("/unifiedOrder/{oid}")
    public String unifiedOrder(@PathVariable String oid, HttpServletResponse response, ModelMap modelMap) throws Exception {

        QfWxConfig config = new QfWxConfig();
        WXPay wxpay = new WXPay(config);

        // 1.根据oid查询订单对象
        Order order = orderService.getOrderById(oid);

        // 订单的信息
        Map<String, String> data = new HashMap<String, String>();
        data.put("body", order.getOrderDetails().get(0).getGname()); // 商品的描述
        data.put("out_trade_no", oid); // 商户订单号
        data.put("device_info", ""); // 设备号
        data.put("fee_type", "CNY"); // 货币类型
        data.put("total_fee", "1"); // 金额
        data.put("spbill_create_ip", "123.12.12.123");
        data.put("notify_url", " http://vmdakq.natappfree.cc/weiXinPayController/resultUrl"); // 微信会滴地址
        data.put("trade_type", "NATIVE");  // 此处指定为扫码支付
        data.put("product_id", "12"); // ?

        try {
            // 对接微信生成一个支付的订单
            Map<String, String> resp = wxpay.unifiedOrder(data);
            System.out.println(resp);

            // 从map中获取二维码的地址
            String code_url = resp.get("code_url");

            // 根据url生成二维码,把二维码直接返回浏览器
//            QRCodeUtils.QREncode(code_url, response.getOutputStream());

            modelMap.put("codeUrl", code_url);

        } catch (Exception e) {
            e.printStackTrace();
        }

        modelMap.put("order", order);


        // 跳转到视图
        return "payPage";
    }

    @RequestMapping("/createQREncode")
    public void createQREncode(String url, HttpServletResponse response) throws Exception {
        QRCodeUtils.QREncode(url, response.getOutputStream());
    }
}
